//
// Created by mingh on 2021/11/21.
//

#ifndef MULTIPLE_CALCULATE_MAIN_H
#define MULTIPLE_CALCULATE_MAIN_H

#include <omp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <immintrin.h>
#include <stdint.h>
#include <math.h>

const int K = 150;


struct list {
    int max_size;
    int length;
    int *array;
} __attribute__((aligned(16)));


void add(struct list *l, int a);
void set(struct list l,int i, int a);
int get(struct list l, int i);
void cut(struct list *l, int i);
void dispose_list(struct list l);

int m_width;
int m_height;
int m_size;

unsigned char *rgb;
//连续存储lab
double *lab;
int N;
//步长
double step;
//指针指向5 * seed长度的数组lab,xy
double *seeds;
//最终的结果(连接孤立像素)
int *labels;
//像素点归属
int *belong;
// RGB->XYZ的查找表
double tableRGB[256];

void load();
//初始化所有变量
void initialize();
//缓存rgb->xyz空间转换
void cache_rgb2xyz();
//rgb->lab无hashmap缓存
void rgb_lab_nocache();
//rgb->lab单点转换无缓存
void rgb2lab_nocache(const unsigned char *sRGB, double *lab_val);
//初始化聚类中心
void find_cluster();
//计算聚类中心
int calculate_center_edges(int ox, int oy);
//计算超像素
void calculate_super_pixel();
//超像素连接孤立像素
void enforce_label_connect();
// 检查并写入
int check();
// 释放内存
void dispose();


#endif //MULTIPLE_CALCULATE_MAIN_H
